# example_tasks.py
"""
示例任务函数
这些函数可以被调度器调用来演示系统功能
"""
import time
import random
import asyncio
import logging
from datetime import datetime
from django.utils import timezone

logger = logging.getLogger(__name__)


def simple_task():
    """简单的同步任务"""
    logger.info("执行简单任务开始")
    time.sleep(2)  # 模拟工作
    result = f"任务完成于 {timezone.now()}"
    logger.info(f"简单任务完成: {result}")
    return result


def calculate_task(a, b, operation='add'):
    """计算任务"""
    logger.info(f"执行计算任务: {a} {operation} {b}")
    
    if operation == 'add':
        result = a + b
    elif operation == 'subtract':
        result = a - b
    elif operation == 'multiply':
        result = a * b
    elif operation == 'divide':
        if b == 0:
            raise ValueError("除数不能为零")
        result = a / b
    else:
        raise ValueError(f"不支持的操作: {operation}")
    
    logger.info(f"计算结果: {result}")
    return result


def random_task():
    """随机成功/失败的任务"""
    logger.info("执行随机任务")
    
    # 随机休眠 1-5 秒
    sleep_time = random.randint(1, 5)
    time.sleep(sleep_time)
    
    # 30% 概率失败
    if random.random() < 0.3:
        error_msg = f"任务随机失败 (休眠了 {sleep_time} 秒)"
        logger.error(error_msg)
        raise Exception(error_msg)
    
    result = f"随机任务成功完成，耗时 {sleep_time} 秒"
    logger.info(result)
    return result


def database_backup_task():
    """数据库备份任务（模拟）"""
    logger.info("开始数据库备份")
    
    # 模拟备份过程
    steps = [
        "连接数据库",
        "导出用户表",
        "导出任务表", 
        "导出日志表",
        "压缩备份文件",
        "上传到云存储"
    ]
    
    for i, step in enumerate(steps, 1):
        logger.info(f"备份进度 {i}/{len(steps)}: {step}")
        time.sleep(1)  # 模拟每个步骤的耗时
    
    backup_file = f"backup_{datetime.now().strftime('%Y%m%d_%H%M%S')}.sql.gz"
    result = f"数据库备份完成: {backup_file}"
    logger.info(result)
    return result


def send_notification_task(message, recipient="admin"):
    """发送通知任务"""
    logger.info(f"发送通知给 {recipient}: {message}")
    
    # 模拟发送过程
    time.sleep(1)
    
    result = f"通知已发送给 {recipient}: {message}"
    logger.info(result)
    return result


def cleanup_logs_task(days_old=30):
    """清理旧日志任务"""
    logger.info(f"开始清理 {days_old} 天前的日志")
    
    # 模拟清理过程
    from app.models import TaskExecutionLog
    from datetime import timedelta
    
    cutoff_date = timezone.now() - timedelta(days=days_old)
    old_logs = TaskExecutionLog.objects.filter(start_time__lt=cutoff_date)
    count = old_logs.count()
    
    if count > 0:
        # 在真实环境中，你可能想要分批删除
        # old_logs.delete()
        logger.info(f"模拟删除了 {count} 条旧日志")
        result = f"清理完成，删除了 {count} 条 {days_old} 天前的日志"
    else:
        result = f"没有找到需要清理的日志（{days_old} 天前）"
    
    logger.info(result)
    return result


async def async_task():
    """异步任务示例"""
    logger.info("开始执行异步任务")
    
    # 异步等待
    await asyncio.sleep(3)
    
    result = f"异步任务完成于 {timezone.now()}"
    logger.info(f"异步任务完成: {result}")
    return result


async def async_fetch_data_task(url="https://api.github.com/zen"):
    """异步数据获取任务"""
    logger.info(f"开始从 {url} 获取数据")
    
    try:
        # 在真实环境中，你会使用 aiohttp 或类似的库
        # 这里只是模拟
        await asyncio.sleep(2)  # 模拟网络请求
        
        result = {
            "url": url,
            "status": "success",
            "data": "Keep it logically awesome.",
            "timestamp": timezone.now().isoformat()
        }
        
        logger.info("数据获取成功")
        return result
        
    except Exception as e:
        logger.error(f"获取数据失败: {e}")
        raise


def error_task():
    """总是失败的任务（用于测试错误处理）"""
    logger.info("执行错误任务")
    time.sleep(1)
    raise Exception("这是一个故意抛出的测试错误")


def heavy_computation_task(n=1000000):
    """重计算任务"""
    logger.info(f"开始重计算任务，计算前 {n} 个质数")
    
    def is_prime(num):
        if num < 2:
            return False
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                return False
        return True
    
    primes = []
    num = 2
    while len(primes) < min(n, 1000):  # 限制最大计算量
        if is_prime(num):
            primes.append(num)
        num += 1
    
    result = f"计算完成，找到 {len(primes)} 个质数，最大质数: {max(primes) if primes else 0}"
    logger.info(result)
    return result


def system_health_check_task():
    """系统健康检查任务"""
    logger.info("开始系统健康检查")
    
    checks = {
        "数据库连接": True,
        "磁盘空间": True,
        "内存使用": True,
        "CPU使用": True,
        "网络连接": True
    }
    
    # 模拟检查过程
    for check_name in checks:
        time.sleep(0.5)
        # 随机设置某些检查失败
        if random.random() < 0.1:  # 10% 概率失败
            checks[check_name] = False
        logger.info(f"检查 {check_name}: {'✓' if checks[check_name] else '✗'}")
    
    failed_checks = [name for name, status in checks.items() if not status]
    
    if failed_checks:
        result = f"健康检查完成，发现问题: {', '.join(failed_checks)}"
        logger.warning(result)
    else:
        result = "系统健康检查通过，所有检查项正常"
        logger.info(result)
    
    return {
        "status": "completed",
        "checks": checks,
        "failed_checks": failed_checks,
        "overall_health": "good" if not failed_checks else "warning"
    }